//
// Created by Administrator on 2025/1/25.
//

#ifndef CONNECTIONPOOL_POOL_H
#define CONNECTIONPOOL_POOL_H

#include <queue>
#include <mutex>
#include <atomic>
#include <memory>
#include <functional>
#include <condition_variable>
#include <thread>
#include <json.hpp>
#include "db.h"
#include "DataBase.hpp"



class Pool {
public:
    static Pool* getInstance();
    //从连接池获取一个空闲的连接
    std::shared_ptr<Connection> getFreeConn();
private:
    Pool();
    //加载配置文件
    bool loadConfigFile(const std::string& file);
    //生产者线程函数
    void produceConnTask();
    //扫描连接线程函数--处理多余的空闲连接
    void scanConnTask();
private:
    PoolConfig _poolConfig;//连接池配置
    std::queue<Connection*> _connQue;//存储 Connection 连接的队列
    std::mutex _queueMutex;//维护队列安全的互斥锁
    std::atomic_int _connCnt;//当前创建的连接总数，不能大于最大连接数
    std::condition_variable cv;//设置条件变量，消费者和生产者之间的线程通信
};


#endif //CONNECTIONPOOL_POOL_H
